#ifndef CFA_H
#define CFA_H
#include "expr.h"
#include <set>
#include <map>
#include <string>

using namespace std;

struct Node{
    int line;
    vector<Node*> prev;//Prev
    //vector<Prop*> predicate;
    virtual ~Node(){ }
    virtual bool operator==(Node &other)=0;
};

class CFA{
    public:
	void* data;
	virtual Node* GetInitNode()=0;
        virtual char* GetId()=0;
        virtual vector<VarExpr*> GetFormPara()=0;
        virtual void PrintCFA()=0;
        virtual void GetGlobalVariable(vector<Expr*>&)=0;
        virtual void CFA2Dot(const char*)=0;
};
void getCFA(vector<CFA*> &, vector<Expr*> &,int, const char **);
void PrintProp(Prop*);
void PrintExpr(Expr*);
void PrintNode(Node*);

//==================
//  Node operations
//==================
bool isBadNode(Node*);
bool isBinNode(Node*);
Node* getTNode(Node*);
Node* getFNode(Node*);
Prop* getProp(Node*);
bool isAssignNode(Node*);
VarExpr* getLval(Node*);
Expr* getRval(Node*);
Node* getNext(Node*);
bool isCallNode(Node*);
vector<Expr*> getActPara(Node*);
char* getFunName(Node*);
bool isReturnNode(Node*);
Expr* getRetExpr(Node*);


#endif
